package domain.entities;

import java.util.*;

import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * A data access object (DAO) providing persistence and search support for
 * Safetydocs entities. Transaction control of the save(), update() and delete()
 * operations can directly support Spring container-managed transactions or they
 * can be augmented to handle user-managed Spring transactions. Each of these
 * methods provides additional information for how to configure it for the
 * desired type of transaction control.
 * 
 * @see domain.entities.Safetydocs
 * @author MyEclipse Persistence Tools
 */

public class SafetydocsDAO extends HibernateDaoSupport {
	private static final Logger log = LoggerFactory
			.getLogger(SafetydocsDAO.class);

	// property constants

	protected void initDao() {
		// do nothing
	}

	public void save(Safetydocs transientInstance) {
		log.debug("saving Safetydocs instance");
		try {
			getHibernateTemplate().save(transientInstance);
			log.debug("save successful");
		} catch (RuntimeException re) {
			log.error("save failed", re);
			throw re;
		}
	}

	public void delete(Safetydocs persistentInstance) {
		log.debug("deleting Safetydocs instance");
		try {
			getHibernateTemplate().delete(persistentInstance);
			log.debug("delete successful");
		} catch (RuntimeException re) {
			log.error("delete failed", re);
			throw re;
		}
	}

	public Safetydocs findById(java.lang.Integer id) {
		log.debug("getting Safetydocs instance with id: " + id);
		try {
			Safetydocs instance = (Safetydocs) getHibernateTemplate().get(
					"domain.entities.Safetydocs", id);
			return instance;
		} catch (RuntimeException re) {
			log.error("get failed", re);
			throw re;
		}
	}

	public List<Safetydocs> findByExample(Safetydocs instance) {
		log.debug("finding Safetydocs instance by example");
		try {
			List<Safetydocs> results = (List<Safetydocs>) getHibernateTemplate()
					.findByExample(instance);
			log.debug("find by example successful, result size: "
					+ results.size());
			return results;
		} catch (RuntimeException re) {
			log.error("find by example failed", re);
			throw re;
		}
	}

	public List findByProperty(String propertyName, Object value) {
		log.debug("finding Safetydocs instance with property: " + propertyName
				+ ", value: " + value);
		try {
			String queryString = "from Safetydocs as model where model."
					+ propertyName + "= ?";
			return getHibernateTemplate().find(queryString, value);
		} catch (RuntimeException re) {
			log.error("find by property name failed", re);
			throw re;
		}
	}

	public List findAll() {
		log.debug("finding all Safetydocs instances");
		try {
			String queryString = "from Safetydocs";
			return getHibernateTemplate().find(queryString);
		} catch (RuntimeException re) {
			log.error("find all failed", re);
			throw re;
		}
	}

	public Safetydocs merge(Safetydocs detachedInstance) {
		log.debug("merging Safetydocs instance");
		try {
			Safetydocs result = (Safetydocs) getHibernateTemplate().merge(
					detachedInstance);
			log.debug("merge successful");
			return result;
		} catch (RuntimeException re) {
			log.error("merge failed", re);
			throw re;
		}
	}

	public void attachDirty(Safetydocs instance) {
		log.debug("attaching dirty Safetydocs instance");
		try {
			getHibernateTemplate().saveOrUpdate(instance);
			log.debug("attach successful");
		} catch (RuntimeException re) {
			log.error("attach failed", re);
			throw re;
		}
	}

	public void attachClean(Safetydocs instance) {
		log.debug("attaching clean Safetydocs instance");
		try {
			getHibernateTemplate().lock(instance, LockMode.NONE);
			log.debug("attach successful");
		} catch (RuntimeException re) {
			log.error("attach failed", re);
			throw re;
		}
	}

    public List<Safetydocs> findByFiltros(Droga droga, List<Droga> drogasProtocolo, Date fecha, Integer id){
        Criteria criteria = getSession().createCriteria(Safetydocs.class);

        if(droga != null)
            criteria.add(Restrictions.eq("droga",droga));
        if(drogasProtocolo.size() > 0)
            criteria.add(Restrictions.in("droga",drogasProtocolo));
        if(fecha != null){
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(fecha);
            calendar.add(Calendar.DATE, 1);
            calendar.add(Calendar.SECOND, -1);
            Date fecha2 = calendar.getTime();
            criteria.add(Restrictions.between("fecha",fecha, fecha2));
        }
        if(id != null)
            criteria.add(Restrictions.eq("id",id));

        List<Safetydocs> result = criteria.list();

        return result;
    }


	public static SafetydocsDAO getFromApplicationContext(ApplicationContext ctx) {
		return (SafetydocsDAO) ctx.getBean("SafetydocsDAO");
	}
}